home *** CD-ROM | disk | FTP | other *** search
/ DS-CD ROM 2 1993 August / DS CD-ROM 2.Ausgabe (August 1993).iso / programm / ds0257 / demo.exe / KEYS.DEM < prev    next >
Text File  |  1992-02-16  |  9KB  |  323 lines

  1. ; ----------------------------
  2. ; KEYS.DEM     - Demoprogramm für die Routinen aus KEYS.MAB
  3. ;                (für den A86)
  4. ;
  5. ;                (c) Bernd Schemmer 1990 - 1992
  6. ;                Letzter Update: 15.02.1992
  7. ;
  8. ; Übersetzen:
  9. ;  A86 MACROS.MAC KEYS.MAB KEYS.DEM DEMOS.INC TO KEYS.COM
  10. ; ---------------------------
  11.  
  12.          jmp start            ; Daten überspringen
  13.  
  14. logo  db CR,LF
  15.       db 'KEYS.DEM  - Demoprogramm für die Routinen aus KEYS.MAB'
  16.       db CR,LF
  17.       db '------------------------------------------------------'
  18.       db CR,LF
  19.       db 'Hinweis: <ALT>-<buchstabe> = Funktionstaste'
  20.       db CR,LF
  21.       db CR,LF
  22. GETLENGTH logo
  23.  
  24. msg1 db
  25. db '┌─────────────────────────────────────────────────────────────────────────────┐',CR,LF
  26. db '│                  Status der Sondertasten                                    │',CR,LF
  27. db '│                  ═══════════════════════                                    │',CR,LF
  28. db '│ SCROLLLOCK  CAPSLOCK  NUMLOCK  INSERT  L-SHIFT R-SHIFT CTRL    ALT          │',CR,LF
  29. db '├─────────────────────────────────────────────────────────────────────────────┤',CR,LF
  30. db '│                                                                             │',CR,LF
  31. db '├─────────────────────────────────────────────────────────────────────────────┤',CR,LF
  32. db '│                  gedrückte Taste                                            │',CR,LF
  33. db '│                  ═══════════════                                            │',CR,LF
  34. db '├─────────────────────────────────────────────────────────────────────────────┤',CR,LF
  35. db '│   Scancode (in AX)  Funktions-Taste     ASCII-Wert   Zeichen                │',CR,LF
  36. db '├─────────────────────────────────────────────────────────────────────────────┤',CR,LF
  37. db '│                                                                             │',CR,LF
  38. db '╞═════════════════════════════════════════════════════════════════════════════╡',CR,LF
  39. db '│              Bitte Taste(n) drücken, <ESC> für Programmende ...             │',CR,LF
  40. db '└─────────────────────────────────────────────────────────────────────────────┘',CR,LF
  41. GETLENGTH msg1
  42.  
  43. ; Offsets der auszufüllenden Felder
  44. SCROLLLOCK_X   EQU 10xD
  45. SCROLLLOCK_Y   EQU 5
  46. STATUS_DIFF    EQU 8
  47.  
  48. SCANCODE_x     EQU 9
  49. SCANCODE_y     EQU 12xD
  50. KEY_DIFF       EQU 20xD
  51. KEY_DIFF1      EQU 13xD
  52.  
  53. msgStart       dw ?           ; Offset des ersten Zeichens von msg im
  54.                               ; Bildschirmspeicher
  55. Scancode       dw 0           ; Scancode der gedrückten Taste
  56. OldStatus      db 0ffH        ; Status der Sondertasten
  57. aktpage        db 0           ; akt. Bildschirmseite
  58.  
  59. start:
  60.          mov ah,0Fh
  61.          int 010h
  62.          mov aktpage,bh       ; akt. Bildschirmseite ermitteln
  63.  
  64.          mov ax,0700h
  65.          mov cx,0
  66.          mov dx,24xD by 79xD
  67.          mov bh,07h
  68.          int 010h             ; Bildschirm löschen
  69.  
  70.          mov dx,0
  71.          mov bh,aktpage
  72.          mov ah,02
  73.          int 010h             ; Cursor setzen
  74.  
  75.          mov cx,logo_length
  76.          mov si,offset logo
  77.          call WriteInt10h     ; Logo ausgeben
  78.  
  79.          mov bh,aktpage
  80.          mov ah,03h
  81.          int 010h             ; Cursor-Position ermitteln
  82.          mov msgstart,dx      ; und sichern
  83.  
  84.          mov cx,msg1_LENGTH
  85.          mov si,offset msg1
  86.          call writeInt10h     ; Maske ausgeben
  87.  
  88.  
  89. MainLoop:                     ; Status der Sondertasten eintragen
  90.          mov dx,msgstart
  91.          add dl,67xD
  92.          add dh,14xD
  93.          mov ah,02h
  94.          int 010h             ; Cursor setzen
  95.  
  96.          keypressed
  97.          jnz >l1              ; Taste gedrückt
  98.          GetKBDStatus
  99.          cmp al,OldStatus
  100.          jz MainLoop          ; keine Veränderungen eingetreten
  101.          mov OldStatus,al
  102.  
  103. l1:
  104.          mov dx,msgstart
  105.          add dx,SCROLLLOCK_Y by SCROLLLOCK_X
  106.  
  107.                               ; Status der Sondertasten ausgeben
  108.          mov bl,'N'
  109.          ScrollLockAktiv?
  110.          if nz mov bl,'J'
  111.          call ShowStatus
  112.  
  113.          mov bl,'N'
  114.          CapsLockAktiv?
  115.          if nz mov bl,'J'
  116.          call ShowStatus
  117.  
  118.          mov bl,'N'
  119.          NumLockAktiv?
  120.          if nz mov bl,'J'
  121.          call ShowStatus
  122.  
  123.          mov bl,'N'
  124.          InsertAktiv?
  125.          if nz mov bl,'J'
  126.          call ShowStatus
  127.  
  128.          mov bl,'N'
  129.          LeftShiftPressed?
  130.          if nz mov bl,'J'
  131.          call ShowStatus
  132.  
  133.          mov bl,'N'
  134.          RightShiftPressed?
  135.          if nz mov bl,'J'
  136.          call ShowStatus
  137.  
  138.          mov bl,'N'
  139.          CtrlPressed?
  140.          if nz mov bl,'J'
  141.          call SHowStatus
  142.  
  143.          mov bl,'N'
  144.          AltPressed?
  145.          if nz mov bl,'J'
  146.          call ShowStatus
  147.  
  148.          Inkey                ; Testen, ob eine Taste gedrückt wurde
  149.  
  150.          if z jmp MainLoop    ; keine Taste gedrückt
  151.  
  152.                               ; Taste gedrückt, AX = Tastencode
  153.          mov Scancode,ax      ; AX sichern
  154.  
  155.                               ; Werte der Taste ausgeben
  156.          mov dx,msgstart
  157.          add dx,SCANCODE_y BY SCANCODE_x
  158.  
  159.          mov bh,aktpage
  160.          mov ah,02h
  161.          int 010h             ; Cursor setzen
  162.  
  163.          mov ax,Scancode
  164.          call ShowScancode    ; SANCODE eintragen
  165.  
  166.          add dl,KEY_DIFF
  167.          mov bh,aktpage
  168.          mov ah,02h
  169.          int 010h             ; Cursor setzen
  170.  
  171.          mov ax,Scancode
  172.          mov bl,'N'           ; auf Funktionstaste testen
  173.          FunctionKey?
  174.          jnz IsNoFunctionKey
  175.          mov bl,'J'           ; ist eine Funktionstaste
  176.          mov Scancode,0
  177.  
  178. IsNoFunctionkey:
  179.          mov al,bl            ; J oder N ausgeben
  180.          mov bl,070h
  181.          mov cx,1
  182.          mov ah,09h
  183.          int 010h
  184.  
  185.                               ; ASCII-Wert eintragen
  186.          add dl,KEY_DIFF1
  187.          mov bh,aktpage
  188.          mov ah,02h
  189.          int 010h             ; Cursor setzen
  190.  
  191.                               ; SCANCode ausgeben
  192.          mov ax,Scancode
  193.          call ShowASCIICode
  194.  
  195.          add dl,KEY_DIFF1+3
  196.          mov bh,aktpage
  197.          mov ah,02h
  198.          int 010h             ; Cursor setzen
  199.  
  200.                               ; und zugerhöriges Zeichen ausgeben
  201.          mov al, b Scancode
  202.          mov bl,070h
  203.          cmp Scancode,0
  204.          jnz >l1
  205.          mov al,BLANK         ; für Funktionstasten löschen
  206.          mov bl,07h
  207. l1:
  208.          mov cx,1
  209.          mov ah,09h
  210.          int 010h
  211.  
  212.          mov ax,SCANCode
  213.          cmp al,ESC           ; ESC gedrückt?
  214.          je Ende              ; ja, Ende
  215.  
  216. MainLoop0:
  217.          jmp Mainloop
  218.  
  219. Ende:
  220.          mov dx,24xD by 0xD
  221.          mov bh,aktpage
  222.          mov ah,02
  223.          int 010h             ; Cursor setzen
  224.  
  225.          EndProcess 0           ; und Programm beenden
  226.  
  227. ; ----------------------------
  228. ; ShowSCANCode
  229. ;
  230. ; Funktion:  Eintragen des SCANCodes in die Maske
  231. ;
  232. ; Eingabe:   AX = Scancode
  233. ;
  234. s0004 db '????h'
  235. s0005 EQU $ - Offset s0004
  236.  
  237. ShowSCANCode:
  238.          mov di,offset s0004
  239.          mov si,di
  240.          call Konvert_AX_To_Hexstring
  241.          mov cx,s0005
  242.          call WriteInt10h
  243.          ret
  244.  
  245. ; ----------------------------
  246. ; ShowASCIICode
  247. ;
  248. ; Funktion:  Eintragen des ASCII-Codes in die Maske
  249. ;
  250. ; Eingabe:   AX = SCANCode
  251. ;
  252. s000     db '???xD, '
  253. s001     db        '??h'
  254. s002 EQU $ - Offset s000
  255.  
  256. s003     db '          '
  257.  
  258. ShowASCIICode:
  259.          or ax,ax
  260.          jnz >l1
  261.          mov si,offset s003   ; für Funktionstasten löschen
  262.          jmp >l2
  263. l1:
  264.          push ax
  265.          mov di,offset s000
  266.          call Konvert_AL_To_Dezstring
  267.          pop ax
  268.          mov di,offset s001
  269.          call Konvert_AL_To_Hexstring
  270.          mov si,offset s000
  271. l2:
  272.          mov cx,s002
  273.          call WriteInt10h
  274.          ret
  275.  
  276. ; ----------------------------
  277. ; ShowStatus
  278. ;
  279. ; Funktion:  Schreibt den akt. Status in die Maske
  280. ;
  281. ; Eingabe:   BL = Wert (J oder N)
  282. ;            DX = Cursorposition
  283. ;
  284. ; AUsgabe:   DL um STATUS_DIFF erhöht
  285. ;
  286. ShowStatus:
  287.                               ; Cursor setzen
  288.          mov bh,aktpage
  289.          mov ah,02h
  290.          int 010h
  291.  
  292.                               ; und Wert in Maske eintragen
  293.          mov al,bl
  294.          mov bl,070h
  295.          mov cx,1
  296.          mov ah,09h
  297.          int 010h
  298.  
  299.          add dl,STATUS_Diff   ; DL korrigieren
  300.          ret
  301.  
  302. ; ----------------------------
  303. ; WriteInt10h
  304. ;
  305. ; Funktion:  Ausgabe einer Zeichenkette über die Funktion 0Eh des
  306. ;            Interrupt 10h
  307. ;
  308. ; Eingabe:   CX = Länge der Zeichenkette
  309. ;            SI = Offset der Zeichenkette
  310. ;
  311. WriteInt10h:
  312.  
  313. l0:
  314.          push cx
  315.          lodsb
  316.          mov ah,0Eh
  317.          int 010h
  318.          pop cx
  319.          loop l0
  320.  
  321.          ret
  322.  
  323.